// ... existing code ...
const jwt = require('jsonwebtoken')
const Response = require('../utils/response')
const { JWT_SECRET } = require('../config/config.default')

/**
 * 用户认证中间件
 * @async
 * @function auth
 * @param {Object} ctx - Koa上下文对象
 * @param {Function} next - Koa中间件next 函数
 * @returns {Promise<void>} 无返回值，通过next()继续执行或返回错误响应
 * @description 
 * 1. 检查ctx.state中是否存在用户信息
 * 2. 验证JWT token的有效性和过期时间
 * 3. 校验token解析出的用户ID与当前用户ID是否一致
 * 4. 捕获并处理JWT验证过程中的各种错误情况
 * @throws {JsonWebTokenError} 当token无效时抛出
 * @throws {TokenExpiredError} 当token过期时抛出
 */
const auth = async (ctx, next) => {
  try {
    const { user, token } = ctx.state

    if (!user) {
      return Response.error(ctx, '用户权限不足，请先登录', 401)
    }
    // 验证 token 合法性
    const decoded = jwt.verify(token, JWT_SECRET)

    // 检查 token 是否过期
    if (decoded.exp < Date.now() / 1000) {
      return Response.error(ctx, 'token已过期，请重新登录', 401)
    }
    // 如果 token 是伪造的或与解析出的 user 不一致，也可在此加额外校验逻辑（可选）
    if (decoded.id !== user.id) {
      return Response.error(ctx, 'token验证失败，请重新登录', 401)
    }
    await next()
  } catch (error) {
    // 统一交给 errorHandler 处理
    throw error
  }
}

module.exports = auth